function simpleDecorator1(value: any, context: any) {
  console.log(`hi, this is ${context.kind} ${context.name}`);
  console.log(context);
  let valueObj = new value("小宇");
  valueObj.buy();
}

// 类装饰器一般用来对类进行操作，可以不返回任何值，
function simpleDecorator2(value: any, context: any) {
  if (context.kind === "class") {
    value.prototype.greet = function () {
      console.log("你好");
    };
  }
}

// 类装饰器可以返回一个函数，替代当前类的构造方法。
function simpleDecorator3(value: any, context: any) {
  let instanceCount = 0;

  const wrapper = function (...args: any[]) {
    instanceCount++;
    const instance = new value(...args);
    instance.count = instanceCount;
    return instance;
  } as unknown as typeof A;

  wrapper.prototype = value.prototype;
  return wrapper;
}

// 类装饰器也可以返回一个新的类，替代原来所装饰的类。
function simpleDecorator4(value: any, context: any) {
  let instanceCount = 0;
  return class extends value {
    constructor(...args: any[]) {
      super(...args);
      instanceCount++;
      this.count = instanceCount;
    }
  };
}

function simpleDecoratorWithParams(params: any) {
  console.log(params);
  return simpleDecorator4;
}

// @ts-ignore
@simpleDecoratorWithParams("我是参数哦")
class A {
  name: string = "小米";
  constructor(name: string) {
    this.name = name;
  }
  buy() {
    console.log(this.name + "购买");
  }
}

/* let a = new A("小玮");
let b = new A("小玮2");
console.log(a instanceof A);
// @ts-ignore
console.log(a.count, a.name);
// @ts-ignore
console.log(b.count, b.name); */
// @ts-ignore
// a.greet();

const a = new A("哈哈");
console.log(a instanceof A);
// @ts-ignore
console.log(a.count, a.name); // 1 哈哈
a.buy(); // 哈哈购买

// 在 JavaScript 中，new.target 是一个元属性（meta property），可以帮助你区分函数是被直接调用还是通过 new 调用的。

// 如果函数或类是通过 new 调用的，new.target 会指向该函数或类本身。
// 如果函数是直接调用的（没有使用 new），new.target 会是 undefined。

class MyClass {
  constructor() {
    if (!new.target) {
      throw new Error("MyClass must be called with 'new'");
    }
    console.log("MyClass instantiated with new");
  }
}
new MyClass();

// new.target 在继承场景中会指向实际被实例化的子类。
class Parent {
  constructor() {
    console.log(new.target.name); // 输出实际实例化的类名
  }
}
class Child extends Parent {
  constructor() {
    super();
  }
}
const child = new Child(); // 输出: "Child"
const parent = new Parent(); // 输出: "Parent"

export {};
